all files / src/helpers/ players.helpers.ts

100% Statements 31/31
100% Branches 2/2
100% Functions 14/14
100% Lines 28/28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58    96× 50×   50×     52×         15×     15×     39×           14×                 11×       13×  
import { Player, Card, Suit, Rank, Game } from '../game.interfaces';
import * as _ from 'lodash';
import { isBomb } from './game.helpers';
 
export function getNextTurn(players: Player[], playerId: string): string {
    const playerIndex = _.findIndex(players, ({ id }) => playerId === id);
    const nextPlayerIndex = playerIndex + 1 === players.length ? 0 : playerIndex + 1;
    
    return players[nextPlayerIndex].id;
}
 
export function getPlayerById(players: Player[], id: string): Player {
    return _.find(players, (player: Player) => player.id === id);
}
 
export function playerExists(players: Player[], id: string) {
    return !!getPlayerById(players, id);
}
 
export function getMaxPlayersCount() {
    return 3;
}
 
export function maxPlayersCountReached(players: Player[]) {
    return players.length === getMaxPlayersCount();
}
 
export function getPlayerTotalPoints(player: Player): number {
    return _.chain(player.battlePoints)
        .compact() // remove bombs (null) and 0 points 
        .sum()
        .value();       
}
 
export function getWinner(players: Player[]): Player|null {
    return _.chain(players)
        .find(player => getPlayerTotalPoints(player) >= 1000)
        .value();
}
 
export function getTotalBombsByPlayer(state: Game, player: string): number {
    const battlePoints = getPlayerById(state.players, player).battlePoints;
    return _.chain(battlePoints)
        .filter(isBomb)
        .size()
        .value();
}
 
export function isOnBarrel(state: Game, player: Player): boolean {
    return getPlayerTotalPoints(player) >= state.settings.barrelPointsLimit;
}
 
export function getNextBiddingTurn(state: Game): string {
    const gamePlayers = state.players;
    const firstRegisteredPlayer: Player = gamePlayers[0];
 
    return _.reduce(firstRegisteredPlayer.battlePoints, (nextPlayer) => getNextTurn(gamePlayers, nextPlayer), firstRegisteredPlayer.id);
}